package com.woniuxy.mqSimplest02;

import com.rabbitmq.client.*;
import com.woniuxy.utils.RabbitConnection;
import lombok.extern.log4j.Log4j2;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

/**
 * @Author: linKe
 * @Date: 2022/1/10 16:37
 * @FileName: Consumer
 * @version: 1.0
 * @Description: 消费者
 */
@Log4j2
public class Consumer3 {
    public static void main(String[] args) throws IOException, TimeoutException {
        // 连接对象
        Connection connection = RabbitConnection.getConnection();
        // 连接通道
        Channel channel = connection.createChannel();
        /*
        声明队列 (String queue, boolean durable, boolean exclusive, boolean autoDelete,
                                        Map<String, Object> arguments)
        queue – 队列的名称
        durable - 是否是持久化队列，如果我们声明一个持久队列，则为真（该队列将在服务器重新启动后继续存在）--true
        exclusive - 是否是独占队列，如果我们声明一个独占队列，则为真（仅限于此连接）要消费当前队列的消息，必须使用创建这个的连接 --false
        autoDelete – 是否是自动删除队列，如果我们声明一个自动删除队列，则为 true（服务器将在不再使用时将其删除） --false
        arguments – 队列相关的其他属性（构造参数）
         */
        channel.queueDeclare("queueSimplest2",true,false,false,null);


        /*
        监听消息
            (String queue, boolean autoAck, Consumer callback)

        String queue – 队列的名称
        boolean autoAck – 如果服务器应考虑消息在传递后确认，则为 true；  自动确认
                          如果服务器应该期待明确的确认，则为 false 手动确认:实际项目使用手动确认
        Consumer callback - 回调  消费者对象的接口
         */
        channel.basicConsume("queueSimplest2",true,new DefaultConsumer(channel){
            /**
             * 处理消息的业务代码
             * @param consumerTag 消息标记，系统会自动分配
             * @param envelope  信封，封装和当前消息相关的消息，后面的手动确认要是用
             * @param properties    发送消息时指定的附加属性
             * @param body          消息体
             */
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                System.out.println("consumerTag:"+consumerTag);
                System.out.println("envelope:"+envelope);
                System.out.println("properties:"+properties);
                System.out.println("body:"+new String(body));

            }
        });

    }



}
